package com.zangs.emqx_expand.emqx.service.impl;

import com.zangs.emqx_expand.common.exception.ServiceException;
import com.zangs.emqx_expand.common.utils.StringUtils;
import com.zangs.emqx_expand.common.utils.uuid.IdUtils;
import com.zangs.emqx_expand.emqx.domain.MqttUser;
import com.zangs.emqx_expand.emqx.mapper.MqttUserMapper;
import com.zangs.emqx_expand.emqx.service.IMqttUserService;
import com.zangs.emqx_expand.emqx.utils.EncryptUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

import javax.annotation.Resource;
import java.util.List;

/**
 * MQTT 用户Service业务层处理
 *
 * @author zangs
 * @since 2025-01-25
 */
@Service
public class MqttUserServiceImpl implements IMqttUserService {
    @Resource
    private MqttUserMapper mqttUserMapper;

    /**
     * 查询MQTT 用户
     *
     * @param id MQTT 用户主键
     * @return MQTT 用户
     */
    @Override
    public MqttUser selectMqttUserById(Long id) {
        return mqttUserMapper.selectMqttUserById(id);
    }

    @Override
    public MqttUser selectMqttUserNoPasswordById(Long id) {
        return mqttUserMapper.selectMqttUserNoPasswordById(id);
    }

    /**
     * 查询MQTT 用户列表
     *
     * @param mqttUser MQTT 用户
     * @return MQTT 用户
     */
    @Override
    public List<MqttUser> selectMqttUserList(MqttUser mqttUser) {
        return mqttUserMapper.selectMqttUserList(mqttUser);
    }

    @Override
    public List<MqttUser> selectMqttUserNoPasswordList(MqttUser mqttUser) {
        return mqttUserMapper.selectMqttUserNoPasswordList(mqttUser);
    }

    /**
     * 新增MQTT 用户
     *
     * @param mqttUser MQTT 用户
     * @return 结果
     */
    @Override
    public int insertMqttUser(MqttUser mqttUser) {
        if (!StringUtils.hasText(mqttUser.getUserUid())) {
            mqttUser.setUserUid(IdUtils.simpleUUID());
        }

        mqttUser.setPassword(EncryptUtils.sha256(mqttUser.getPassword(), mqttUser.getSalt()));
        return mqttUserMapper.insertMqttUser(mqttUser);
    }

    /**
     * 修改MQTT 用户
     *
     * @param mqttUser MQTT 用户
     * @return 结果
     */
    @Override
    public int updateMqttUser(MqttUser mqttUser) {
        //可以修改密码不修改盐，但是不能修改盐而不修改密码
        if (!StringUtils.hasText(mqttUser.getPassword()) && StringUtils.hasText(mqttUser.getSalt())) {
            throw new ServiceException("修改盐时必须修改密码");
        }
        // 如果密码被设置，则进行加密处理
        if (StringUtils.hasText(mqttUser.getPassword())) {
            String salt;
            // 如果提供了盐，使用提供的盐；否则，从数据库中获取当前用户的盐
            if (StringUtils.hasText(mqttUser.getSalt())) {
                salt = mqttUser.getSalt();
            } else {
                MqttUser existingUser = mqttUserMapper.selectMqttUserById(mqttUser.getId());
                if (ObjectUtils.isEmpty(existingUser)) {
                    throw new ServiceException("未找到指定ID的用户");
                }
                salt = existingUser.getSalt();
            }
            mqttUser.setPassword(EncryptUtils.sha256(mqttUser.getPassword(), salt));
        }
        return mqttUserMapper.updateMqttUser(mqttUser);
    }

    /**
     * 批量删除MQTT 用户
     *
     * @param ids 需要删除的MQTT 用户主键
     * @return 结果
     */
    @Override
    public int deleteMqttUserByIds(Long[] ids) {
        return mqttUserMapper.deleteMqttUserByIds(ids);
    }

    /**
     * 删除MQTT 用户信息
     *
     * @param id MQTT 用户主键
     * @return 结果
     */
    @Override
    public int deleteMqttUserById(Long id) {
        return mqttUserMapper.deleteMqttUserById(id);
    }
}
